package com.lxu;

import java.io.File;

/**
 * 本实例开启了两个线程，分别是main线程和MyThread线程，MyThread线程对共享变量flag进行了修改，但是main线程却取不到flag的最新值
 * @see private volatile boolean flag = false; volatile关键字可以实现工作内存和主内存数据的一致性
 *在没有volatile修饰的情况下，以下三种情况，也会让工作内存的数据失效，从而实现读取主内存数据：
 *  @see System.out.println();
 *  @see Thread.sleep(10);
 *  @see File file = new File("D:\\1.txt");
 */
public class VolatileDemo1 {

    public static void main(String[] args) throws InterruptedException {

        MyThread myThread = new MyThread("multipleThread");
        myThread.start();

        while (true) {
            //System.out.println();//同步方法
            //Thread.sleep(10);//线程休眠
            //File file = new File("D:\\1.txt");//IO操作
            if (myThread.isFlag()) {
                System.out.println("main进程读取到的Flag值为：" + myThread.isFlag());
                break;
            }
        }
    }


    static class MyThread extends Thread {
        private volatile boolean flag = false;

        public MyThread(String threadName) {
            super(threadName);
        }

        public boolean isFlag() {
            return flag;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            flag = true;
            if (flag) {
                System.out.println("子线程已经成功修改了Flag的值，Flag为：" + flag);
            }
        }
    }
}
